import ebooklib
from ebooklib import epub
from bs4 import BeautifulSoup
import os
import shutil
from urllib.parse import unquote

def epub_to_html(epub_path, output_dir=None):
    """
    将 EPUB 文件拆解为 HTML 文件，保留原始结构和图片
    
    Args:
        epub_path: EPUB 文件路径
        output_dir: 输出目录路径，如果为 None 则使用 EPUB 文件名创建目录
    """
    if not os.path.exists(epub_path):
        print(f"错误：文件 {epub_path} 不存在")
        return
    
    # 创建输出目录
    if output_dir is None:
        output_dir = os.path.splitext(epub_path)[0]
    os.makedirs(output_dir, exist_ok=True)
    
    # 创建图片目录
    images_dir = os.path.join(output_dir, 'images')
    os.makedirs(images_dir, exist_ok=True)
    
    try:
        # 读取 EPUB 文件
        book = epub.read_epub(epub_path)
        
        # 获取书籍标题
        title = book.get_metadata('DC', 'title')[0][0] if book.get_metadata('DC', 'title') else 'Untitled'
        
        # 创建索引文件
        index_html = os.path.join(output_dir, 'index.html')
        with open(index_html, 'w', encoding='utf-8') as f:
            f.write(f'''<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{title}</title>
    <style>
        body {{ font-family: Arial, sans-serif; margin: 20px; }}
        h1 {{ color: #333; }}
        ul {{ list-style-type: none; padding: 0; }}
        li {{ margin: 10px 0; }}
        a {{ color: #0066cc; text-decoration: none; }}
        a:hover {{ text-decoration: underline; }}
    </style>
</head>
<body>
    <h1>{title}</h1>
    <ul>
''')
        
        # 图片路径映射表
        image_map = {}
        
        # 处理所有项目
        for item in book.get_items():
            # 处理图片
            if item.get_type() == ebooklib.ITEM_IMAGE:
                # 获取图片文件名
                img_name = os.path.basename(unquote(item.get_name()))
                # 保存图片
                img_path = os.path.join(images_dir, img_name)
                with open(img_path, 'wb') as f:
                    f.write(item.get_content())
                # 存储映射关系
                image_map[item.get_name()] = f'images/{img_name}'
                print(f"已保存图片：{img_name}")
            
            # 处理文档
            elif item.get_type() == ebooklib.ITEM_DOCUMENT:
                # 获取文件名
                file_name = os.path.basename(unquote(item.get_name()))
                if not file_name.endswith('.html'):
                    file_name += '.html'
                
                # 获取章节内容
                content = item.get_content().decode('utf-8')
                
                # 使用 BeautifulSoup 解析 HTML
                soup = BeautifulSoup(content, 'html.parser')
                
                # 更新图片路径
                for img in soup.find_all('img'):
                    src = img.get('src', '')
                    if src in image_map:
                        img['src'] = image_map[src]
                
                # 保存 HTML 文件
                output_path = os.path.join(output_dir, file_name)
                with open(output_path, 'w', encoding='utf-8') as f:
                    f.write(f'''<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{file_name}</title>
    <style>
        body {{ font-family: Arial, sans-serif; margin: 20px; }}
        img {{ max-width: 100%; height: auto; }}
    </style>
</head>
<body>
{soup.prettify()}
</body>
</html>
''')
                
                # 添加到索引
                with open(index_html, 'a', encoding='utf-8') as f:
                    f.write(f'        <li><a href="{file_name}">{file_name}</a></li>\n')
                
                print(f"已保存文档：{file_name}")
        
        # 完成索引文件
        with open(index_html, 'a', encoding='utf-8') as f:
            f.write('''    </ul>
</body>
</html>
''')
        
        print(f"\n转换完成！所有文件已保存至目录：{output_dir}")
        print(f"图片已保存至目录：{images_dir}")
        print(f"索引文件：{index_html}")
    
    except Exception as e:
        print(f"转换过程中出现错误：{str(e)}")

if __name__ == "__main__":
    import argparse
    
    parser = argparse.ArgumentParser(description='将 EPUB 文件拆解为 HTML 文件')
    parser.add_argument('epub_path', help='EPUB 文件路径')
    parser.add_argument('-o', '--output', help='输出目录路径（可选）')
    
    args = parser.parse_args()
    epub_to_html(args.epub_path, args.output) 